import express from "express";

import dgram from "dgram";

export let udpRouter = express.Router();

let data = [];

udpRouter.get("/getUdpData", (req, res) => res.send(data));

const udpSocket = new dgram.Socket("udp4");

//定义补零函数
let zeroPadding = (data) => {
  // if(data.toString(2).length===1){
  //     return '0000000' + data.toString(2)
  // }
  // if(data.toString(2).length===2){
  //     return '000000' + data.toString(2)
  // }
  // if(data.toString(2).length===3){
  //     return '00000' + data.toString(2)
  // }
  // if(data.toString(2).length===4){
  //     return '0000' + data.toString(2)
  // }
  // if(data.toString(2).length===5){
  //     return '000' + data.toString(2)
  // }
  // if(data.toString(2).length===6){
  //     return '00' + data.toString(2)
  // }
  // if(data.toString(2).length===7){
  //     return '0' + data.toString(2)
  // }
  // if(data.toString(2).length===8){
  //     return data.toString(2)
  // }
  //不足八位字节数在其左边补零补足八位
  let step = 8 - data.toString(2).length;
  let str = data.toString(2);
  for (let i = 0; i < step; i++) {
    str = "0" + str;
  }
  return str;
};

// 监听接收数据
udpSocket.on("message", (msg) => {
  /* 
    1.接收过来的数据取 msg[2],msg[3],msg[4] 这三段该数据是十进制数据
    2.将接收过来的数据转化为时、分、秒、帧
      2.1将数据转换为二进制数据然后将三段数据倒过来拼接成一串字符串
      2.2从拼接好的二进制字符串中从右往左取 0~6 bits 为帧率，7~12 bits 为秒，13~18 bits 为分 19~23bit 为时
      2.3如果时、分、秒、帧的字节数不足八个字节则须在其左侧补零补足八个字节
      2.4将二进制的时、分、秒、帧 转换为十进制的时、分、秒、帧
    3.十进制转换为二进制数 decimalData.toString(2) 二进制数转换为十进制数 parseInt(binaryData,2)
    */

  //将接收过来的三段数据转化成二进制数据并倒序拼接成二进制字符串
  let binaryString =
    zeroPadding(msg[4]) + zeroPadding(msg[3]) + zeroPadding(msg[2]);
  //取该二进制字符串中的 19~23 位字节数转换为小时
  let hours = parseInt(binaryString.substring(0, 5), 2);
  //取该二进制字符串中的 13~28 位字节数转换为分钟
  let minutes = parseInt(binaryString.substring(5, 11), 2);
  //取该二进制字符串中的 7~12 位字节数转换为秒
  let seconds = parseInt(binaryString.substring(11, 17), 2);
  //取该二进制字符串中的 0~6 位字节数转换为帧
  let frame = parseInt(binaryString.substring(17, 24), 2);
  data = [hours, minutes, seconds, frame];
  console.log(data);
});

//监听错误信息
udpSocket.on("error", (err) => {
  console.log(err.stack);
  udpSocket.close();
});

// 监听服务器开启
udpSocket.on("listening", () => console.log("UDP服务器已开启"));

udpSocket.bind(6301);

// udpSocket.bind({
//     address: '192.168.10.21',
//     port: 6301,
//     exclusive: true
//   })
